/*
 * 本文件实现以下功能：
 * 1.日志宏定义
 * 2.Json序列化与反序列化
 * 3.uuid的生成
 */
#pragma once
#include <cstdio>
#include <ctime>
#include <string>
#include <iostream>
#include <memory>
#include <sstream>
#include <random>
#include <jsoncpp/json/json.h> //编译时需要链接jsoncpp库 eg. -ljsoncpp
#include <uuid/uuid.h>         //编译时需要链接uuid库 eg. -luuid

namespace jsonrpc
{
// 日志宏定义
#define LEVEL_DEBUG 0
#define LEVEL_INFO 1
#define LEVEL_ERROR 2

#define LEVEL_DEFAULT LEVEL_DEBUG

#define LOG(level, format, ...)                                                                       \
    {                                                                                                 \
        if (level >= LEVEL_DEFAULT)                                                                   \
        {                                                                                             \
            time_t now = time(nullptr);                                                               \
            struct tm *ptm = localtime(&now);                                                         \
            char time_str[64];                                                                        \
            strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S", ptm);                           \
            fprintf(stdout, "[%s][%s:%d] " format "\n", time_str, __FILE__, __LINE__, ##__VA_ARGS__); \
        }                                                                                             \
    }
#define LOG_DEBUG(format, ...) LOG(LEVEL_DEBUG, format, ##__VA_ARGS__)
#define LOG_INFO(format, ...) LOG(LEVEL_INFO, format, ##__VA_ARGS__)
#define LOG_ERROR(format, ...) LOG(LEVEL_ERROR, format, ##__VA_ARGS__)

    // Json序列化与反序列化
    class JsonUtil
    {
    public:
        // 把std::string序列化为Json
        static bool serialize(const Json::Value &val, std::string &body)
        {
            std::stringstream ss;
            Json::StreamWriterBuilder swb;
            std::unique_ptr<Json::StreamWriter> sw(swb.newStreamWriter());
            int res = sw->write(val, &ss);
            if (res != 0)
            {
                LOG_ERROR("JsonUtil::Serialize failed");
                return false;
            }
            body = ss.str();
            return true;
        }

        static bool deserialize(const std::string &body, Json::Value &val)
        {
            Json::CharReaderBuilder crb;
            std::string errs;
            std::unique_ptr<Json::CharReader> cr(crb.newCharReader());
            bool res = cr->parse(body.c_str(), body.c_str() + body.size(), &val, &errs);
            if (!res)
            {
                LOG_ERROR("JsonUtil::Deserialize failed");
                return false;
            }
            return true;
        }
    };

    // uuid的生成
    class UUIDUtil
    {
    public:
        static std::string generateUUID()
        {
            // 创建一个UUID
            uuid_t uuid;
            uuid_generate_random(uuid);

            // 将UUID转换为字符串
            char uuid_str[37];
            uuid_unparse(uuid, uuid_str);

            return std::string(uuid_str);
        }
    };
}